/*
能发送ajax请求的函数模块
函数的返回值是promise对象
 */
import axios from 'axios'
import {Toast} from 'antd-mobile'

// 请求拦截器
import pending from "./pending";

axios.defaults.timeout = 20000;
axios.defaults.baseURL = "/api/";


let cancelToken = axios.CancelToken;
let removePending = ever => {
  for (let p in pending._axiosPromiseCancel) {
    if (pending._axiosPromiseCancel[p].u === ever.url + "&" + ever.method) {
      //当当前请求在数组中存在时执行函数体
      pending._axiosPromiseCancel[p].f(); //执行取消操作
      pending._axiosPromiseCancel.splice(p, 1); //把这条记录从数组中移除
    }
  }
};

axios.defaults.headers.post["Content-Type"] = "application/json";
//http request 拦截器
axios.interceptors.request.use(
  config => {
    // config.data = JSON.stringify(config.data);
    // config.headers = {
    //   "Content-Type": "application/x-www-form-urlencoded"
    // };
    // ------------------------------------------------------------------------------------
    removePending(config); //在一个ajax发送前执行一下取消操作
    config.cancelToken = new cancelToken(c => {
      // 这里的ajax标识我是用请求地址&请求方式拼接的字符串，当然你可以选择其他的一些方式
      pending._axiosPromiseCancel.push({
        u: config.url + "&" + config.method,
        f: c
      });
    });
    // -----------------------------------------------------------------------------------------

    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

//http response 拦截器
axios.interceptors.response.use(
  response => {
    return response;
  },
  error => {
    // return Promise.reject(error);
    if (axios.isCancel(error)) {
      // 为了终结promise链 就是实际请求 不会走到.catch(rej=>{});这样就不会触发错误提示之类了。
      return new Promise(() => {});
    } else {
      return Promise.reject(error);
    }
  }
);

const baseUrl = ''
// const baseUrl = 'http://localhost:4000'
export default function ajax(url, data={}, type='GET') {
  url = baseUrl + url
  if(type==='GET') { // 发送GET请求
    // 拼请求参数串
    // data: {username: tom, password: 123}
    // paramStr: username=tom&password=123
    let paramStr = ''
    Object.keys(data).forEach(key => {
      paramStr += key + '=' + data[key] + '&'
    })
    if(paramStr) {
      paramStr = paramStr.substring(0, paramStr.length-1)
    }
    // 使用axios发get请求
    return axios.get(url + '?' + paramStr)
  } else {// 发送POST请求
    // 使用axios发post请求
    return axios.post(url, data)
  }
}
